#Requires AutoHotkey v2.0
#Include SimLog.ahk
#Include FD_HotStrings.ahk

; ----- 热字符串图形界面 -----
; v1.00_bate

class FD_HotStringsGUI {

    ; 窗口名称（用于日志记录）
    name := "[FD_HotStringsGUI V1.00_bate]"

    ; 日志对象，用于记录窗口的打开与关闭等操作
    log := SimLog()

    ; 主 GUI 窗口句柄
    gui := Gui("+AlwaysOnTop +Resize", "快捷输入对应表")

    ; ListView 控件句柄（用于显示用户自定义和系统预设的快捷键内容）
    listViewUser := ""
    listViewSys := ""

    ; Tab 控件句柄
    tab := ""

    ; 窗口是否已显示标志位
    displayed := false

    ; 用于在类之间传递数据的对象（如快捷键内容、日志路径等）
    dataTemp := Object()

    __New(dataTemp := this.dataTemp) {

        ; 接收外部传入的共享数据对象
        this.dataTemp := dataTemp
        this.log.logPath := dataTemp.log.logPath

        ; 设置 GUI 字体
        this.gui.SetFont("s9", "Segoe UI")

        ; 绑定窗口关闭事件
        this.gui.OnEvent("Close", (*) => this.gui_close(this.gui))

        ; 添加 Tab 控件，包含三个标签页
        this.tab := this.gui.Add("Tab3", "w420 h330", ["用户", "系统", "设置"])

        ; ---------- 第一个 Tab 页：用户自定义 ----------
        ; 指定接下来的控件添加到第1个标签页中
        this.tab.UseTab(1)

        ; 添加 ListView 控件（两列：快捷键 和 替换内容）
        this.listViewUser := this.gui.Add(
            "ListView",
            "w390 h260 x10 y40 +Grid",
            ["快捷输入", "替换内容"]
        )

        ; 遍历用户自定义 Map 数据并填入列表
        for key, value in dataTemp.userHs {
            this.listViewUser.Add("", key, value)
        }

        ; 双击 ListView 行可触发编辑事件
        this.listViewUser.OnEvent("DoubleClick", (lv, row) => this.EditRow(lv, row))

        ; 创建右键菜单
        this.addMenu()


        ; ---------- 第二个 Tab 页：系统预设 ----------
        ; 指定接下来的控件添加到第2个标签页中
        this.tab.UseTab(2)

        ; 设置字体颜色为红色
        this.gui.SetFont("cRed")  

        ; 添加系统预设快捷键的 ListView 控件
        this.listViewSys := this.gui.Add(
            "ListView",
            "w390 h260 x10 y40 +Grid -ReadOnly +Checked",  ; 添加复选框功能
            ["快捷输入(启用)", "替换内容"]
        )
        
        ; 遍历系统预设 Map 数据并填入列表
        for key, value in dataTemp.hsNote {
            row := this.listViewSys.Add("Check", key, value.note)
        }

        ; 双击编辑系统项
        this.listViewSys.OnEvent("DoubleClick", (lv, row) => MsgBox("系统预设快捷输入无法修改", "提示", 0x40000))
        
        ; 选项被选中
        this.listViewSys.OnEvent("ItemCheck", (lv, row, checked) => this.listViewSys_ItemCheck(lv, row, checked))
        
        ; 还原字体颜色
        this.gui.SetFont("cDefault")

        ; ---------- 第三个 Tab 页：设置 ----------
        ; 当前尚未添加设置控件，可留作扩展
        this.tab.UseTab(3)

    }

    ; 显示窗口（仅在首次调用时显示一次）
    Show() {
        if (!this.displayed) { ; 避免重复打开
            this.gui.Show("w420 h340")
            this.displayed := true ; 标记为已显示
            this.log.info(Format("{1} 图形界面开启", this.name))
        }
    }

    ; 编辑 ListView 中某一行的快捷键及替换值
    EditRow(lv, row) {
        if (row <= 0) {
            return
        }

        ; 获取当前行的原始键值
        oldKey := lv.GetText(row, 1)
        oldValue := lv.GetText(row, 2)

        ; 创建临时 GUI 供用户输入新的值
        inputGui := Gui("+AlwaysOnTop +Resize", "编辑")
        inputGui.SetFont("s9", "Segoe UI")

        ; 添加快捷键输入
        inputGui.Add("Text", , "快捷键：")
        keyEdit := inputGui.Add("Edit", "w200", oldKey)

        ; 添加替换内容输入
        inputGui.Add("Text", , "替换内容：")
        valueEdit := inputGui.Add("Edit", "w200", oldValue)

        result := false

        ; ---------- 按钮布局：同一行居中 ----------
        ; 按钮宽度与间距设置
        buttonWidth := 70
        spacing := 20
        totalWidth := buttonWidth * 2 + spacing
        startX := (250 - totalWidth) // 2 - 10  ; 假定内容区域宽度为 250 像素

        ; 添加“确定”按钮并绑定点击事件
        okBtn := inputGui.Add("Button", Format("x{1} yp+30 w{2}", startX, buttonWidth), "确定")
        okBtn.OnEvent("Click", (*) => (
            result := true,
            inputGui.Hide()
        ))

        ; 添加“取消”按钮并绑定点击事件
        cancelBtn := inputGui.Add("Button", Format("x+{1} w{2}", spacing, buttonWidth), "取消")
        cancelBtn.OnEvent("Click", (*) => inputGui.Hide())

        ; 显示编辑窗口并等待用户操作
        inputGui.Show("AutoSize Center")

        ; 记录日志
        this.log.info(Format("{1} 进入快捷输入修改界面", this.name))

        WinWaitClose(inputGui.Hwnd)

        ; 如果用户确认了修改
        if result {
            newKey := keyEdit.Text
            newValue := valueEdit.Text

            ; 如果快捷键发生了变动，删除旧键，添加新键
            if newKey != oldKey {
                this.dataTemp.userHs.Delete(oldKey)
            }
            this.dataTemp.userHs[newKey] := newValue

            ; 更新列表中显示的数据
            lv.Modify(row, , newKey, newValue)

            ; 更新实际数据
            this.dataTemp.userHs.delete(oldKey)
            this.dataTemp.userHs.Set(newKey,newValue)
            NiCole.writeMap(this.dataTemp.userHsIni,this.dataTemp.userHs)
            NiCole.setUserHs(this.dataTemp.userHs)

            ; 记录日志
            this.log.info(Format("{1} 快捷输入对应关系更新", this.name))
            this.log.debug(Format('{5} 旧: "{1}"="{2}" ====> 新: "{3}"="{4}"', oldkey, oldValue, newKey, newValue,this.name))

            return
        }
        
        ; 记录日志
        this.log.info(Format("{1} 快捷输入对应关系未修改", this.name))
        return
    }
    
    ; 创建右键菜单
    addMenu(){
        
        this.menu := Menu()
        this.menu.menu_add := this.menu.Add("添加",(*)=>MsgBox("功能等待实现", "提示", 0x1000))
        this.menu.menu_mod := this.menu.Add("修改",(*)=>MsgBox("功能等待实现", "提示", 0x1000))
        this.menu.menu_del := this.menu.Add("删除",(*)=>MsgBox("功能等待实现", "提示", 0x1000))
        this.listViewUser.OnEvent("ContextMenu", (GuiCtrlObj, Item, IsRightClick, X, Y) => this.menu_contextMenu(GuiCtrlObj, Item, IsRightClick, X, Y))

    }

    ; ------------------------ 回调事件 ------------------------
    ; GUI 窗口关闭时的回调函数
    gui_close(thisGui) {
        this.displayed := false ; 重置已显示标志
        this.log.info(Format("{1} 图形界面关闭", this.name))
        thisGui.Hide() ; 实际隐藏窗口而非销毁
    }

    listViewSys_ItemCheck(lv, row, checked) {
        ; 如果用户试图取消选中（checked 为 0），立即重新选中
        if !checked {
            SetTimer(() => lv.Modify(row, "Check"), -10)
        }
    }

    menu_contextMenu(GuiCtrlObj, Item, IsRightClick, X, Y){

        ; 如果没有选中行但右键点中了某行，则选中该行
            
        this.menu.Show(X, Y)
    }

}
